package cn.icanci.loopstack.bic.biz.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import com.google.common.collect.Lists;

import cn.icanci.loopstack.bic.biz.dts.GraphDtsServiceProxy;
import cn.icanci.loopstack.bic.biz.mapper.NodeVueMapper;
import cn.icanci.loopstack.bic.biz.service.NodeVueService;
import cn.icanci.loopstack.bic.biz.utils.TemplateFileUtils;
import cn.icanci.loopstack.bic.common.model.TextValue;
import cn.icanci.loopstack.bic.common.model.base.NodeVueVO;
import cn.icanci.loopstack.bic.dal.mongo.common.PageList;
import cn.icanci.loopstack.bic.dal.mongo.daointerface.NodeVueDAO;
import cn.icanci.loopstack.bic.dal.mongo.dateobject.NodeVueDO;

/**
 * @author icanci
 * @since 1.0 Created in 2023/09/14 21:11
 */
@Service
public class NodeVueServiceImpl implements NodeVueService {
    @Resource
    private NodeVueDAO           nodeVueDAO;
    @Resource
    private NodeVueMapper        nodeVueMapper;
    @Resource
    private GraphDtsServiceProxy graphDtsServiceProxy;

    @Override
    public List<NodeVueVO> queryAll() {
        return nodeVueMapper.dos2vos(nodeVueDAO.queryAll());
    }

    @Override
    public void save(NodeVueVO nodeVueVO) {
        // TODO 日志记录
        // TODO 更新视图
        if (doInsert(nodeVueVO)) {
            NodeVueDO insert = nodeVueMapper.vo2do(nodeVueVO);
            nodeVueDAO.insert(insert);
        } else {
            nodeVueDAO.update(nodeVueMapper.vo2do(nodeVueVO));
            graphDtsServiceProxy.dtsUnitViewTree(nodeVueVO);
        }
    }

    @Override
    public NodeVueVO queryById(String id) {
        return nodeVueMapper.do2vo(nodeVueDAO.queryOneById(id));
    }

    @Override
    public PageList<NodeVueVO> queryPage(NodeVueVO nodeVueVO, int pageNum, int pageSize) {
        PageList<NodeVueDO> pageQuery = nodeVueDAO.pageQuery(nodeVueMapper.vo2do(nodeVueVO), pageNum, pageSize);
        return new PageList<>(nodeVueMapper.dos2vos(pageQuery.getData()), pageQuery.getPaginator());

    }

    @Override
    public NodeVueVO queryBySystemUuidAndName(String systemUuid, String name) {
        return nodeVueMapper.do2vo(nodeVueDAO.queryBySystemUuidAndName(systemUuid, name));
    }

    @Override
    public NodeVueVO queryBySystemUuidAndKey(String systemUuid, String key) {
        return nodeVueMapper.do2vo(nodeVueDAO.queryBySystemUuidAndKey(systemUuid, key));
    }

    @Override
    public List<TextValue> loadSelector(String systemUuid, String nodeUuid) {
        List<NodeVueVO> nodeVues = queryAll();
        List<TextValue> textValues = Lists.newArrayList();
        for (NodeVueVO nodeVue : nodeVues) {

            if (!StringUtils.equals(systemUuid, nodeVue.getSystemUuid())) {
                continue;
            }
            if (!StringUtils.equals(nodeUuid, nodeVue.getNodeUuid())) {
                continue;
            }

            String label;
            if (isDeleted(nodeVue)) {
                label = String.format(DELETED_FORMAT, nodeVue.getNodeVueName());
            } else {
                label = String.format(NOT_DELETED_FORMAT, nodeVue.getNodeVueName());
            }
            String value = nodeVue.getUuid();
            textValues.add(new TextValue(label, value));
        }
        return textValues;
    }

    @Override
    public String loadDefaultVue() {
        return TemplateFileUtils.queryDefaultNodeVueTemplate();
    }

    @Override public NodeVueVO queryByUuid(String nodeVueUuid) {
        return nodeVueMapper.do2vo(nodeVueDAO.queryByUuid(nodeVueUuid));
    }
}
